//被操作的角色id
var roleid = 0;


$(function(){
		

	//权限配置
	$(".accessConfig").click(function(){
		//清空数据
		$("#tree").html("");
		//清空数组
		zNodes = new Array();
		//销毁
		$.fn.zTree.destroy("tree");
		
		var url = $(this).data('url');
		var rid = $(this).data("rid");
		//把当前被操作的角色id 存储到全局变量中
		roleid = rid;
		
		//角色id写入权限提交按钮
		$("#submitPermission").attr('data-rid' , rid);
		
		$.get(url , {} , function(data , s , x){
			
			var list = data.data.list;
			for(var i in list) {
				var code = "";
				if(list[i].codeorurl != null && list[i].codeorurl != "") {
					code = "-" + list[i].codeorurl;
				}
				
			 	ptype = {
					"id" : list[i].id,
					"pid" : list[i].pid,
					"name" : list[i].name + code,
					"path" : list[i].path,
					"checked" : list[i].checked,
					"open" : false
				}
				zNodes.push(ptype);
			}
			$.fn.zTree.init($("#tree"), setting, zNodes);
		});
	});
	
	//权限提交
	$("#submitPermission").click(function(e){
		//提交的数据
		var pids = "";
		var url  = $(this).data('url');
		//var rid  = $(this).data('rid');
		
		var selectPermission = new Array();
		
		var treeObj = $.fn.zTree.getZTreeObj("tree");
		//获取被选中的元素
		var nodes = treeObj.getCheckedNodes(true);
		
		
		for(var i in nodes) {
			if(nodes[i].name.indexOf('-') > 0 && nodes[i].checked) {
				selectPermission.push(nodes[i].id);
			}
		}
		
		
		
		//数组转字符串
		pids = selectPermission.join(',');
		//console.log('data=' + pids);
		
		$.ajax({
		     type: 'POST',
		     url: url,
		     data: {"pids" : pids , "rid" : roleid} ,
		     success: function(data , s , x){
		    	if(!data.code) {
					alert(data.msg);
				} else {
					//成功隐藏
					$('#myModal').modal('hide');
				}
		     } ,
		     dataType: 'json',
		});
		
	});
	
})

/**
 * 全局变量
 */
var log, className = "dark";

var roleid;

var zNodes = new Array();
var ptypecreate = false; //新增权限
var ptypeupdate = false; //更新权限
var ptypedelete = false; //删除权限

// 设置
var setting = {
	view : {
		// 用于当鼠标移动到节点上时，显示用户自定义控件，显示隐藏状态同 zTree 内部的编辑、删除按钮
		// 请务必与 setting.view.removeHoverDom 同时使用；属于高级应用，使用时请确保对 zTree 比较了解。
		// 默认值：null
		addHoverDom : addHoverDom,

		// 用于当鼠标移出节点时，隐藏用户自定义控件，显示隐藏状态同 zTree 内部的编辑、删除按钮
		// 请务必与 addHoverDom 同时使用；属于高级应用，使用时请确保对 zTree 比较了解。
		// 默认值：null
		removeHoverDom : removeHoverDom,

		// 设置是否允许同时选中多个节点。
		// 默认值: true
		selectedMulti : false
	},
	edit : {

		// 设置 zTree 是否处于编辑状态
		// 请在初始化之前设置，初始化后需要改变编辑状态请使用 zTreeObj.setEditable() 方法
		// 默认值: false
		enable : true,

		// 节点编辑名称 input 初次显示时,设置 txt 内容是否为全选状态。 [setting.edit.enable = true 时生效]
		// 默认值: false
		editNameSelectAll : false,

		// 设置是否显示删除按钮。[setting.edit.enable = true 时生效]
		// 当点击某节点的删除按钮时：
		// 1、首先触发 setting.callback.beforeRemove 回调函数，用户可判定是否进行删除操作。
		// 2、如果未设置 beforeRemove 或 beforeRemove 返回 true，则删除节点并触发
		// setting.callback.onRemove 回调函数。
		// 默认值：true
		showRemoveBtn : showRemoveBtn,

		// 设置是否显示编辑名称按钮。[setting.edit.enable = true 时生效]
		// 当点击某节点的编辑名称按钮时：
		// 1、进入分类编辑名称状态。
		// 2、编辑名称完毕（Input 失去焦点 或 按下 Enter 键），会触发 setting.callback.beforeRename
		// 回调函数，用户可根据自己的规则判定是否允许修改名称。
		// 3、如果 beforeRename 返回 false，则继续保持编辑名称状态，直到名称符合规则位置 （按下 ESC
		// 键可取消编辑名称状态，恢复原名称）。
		// 4、如果未设置 beforeRename 或 beforeRename 返回 true，则结束节点编辑名称状态，更新分类名称，并触发
		// setting.callback.onRename 回调函数。
		// 默认值：true
		showRenameBtn : showRenameBtn
	},

	data : {
		simpleData : {
			// 确定 zTree 初始化时的节点数据、异步加载时的节点数据、或 addNodes 方法中输入的 newNodes
			// 数据是否采用简单数据模式 (Array)
			// 不需要用户再把数据库中取出的 List 强行转换为复杂的 JSON 嵌套格式
			// 默认值：false
			enable : true,
			idKey : "id",
			pIdKey : "pid",
		},
		
	},

	callback : { // 回调
		// 用于捕获节点被拖拽之前的事件回调函数，并且根据返回值确定是否允许开启拖拽操作默认值：null
		beforeDrag : beforeDrag,
	

		// 用于捕获节点编辑按钮的 click 事件，并且根据返回值确定是否允许进入名称编辑状态
		// 此事件回调函数最主要是用于捕获编辑按钮的点击事件，然后触发自定义的编辑界面操作。
		// 默认值：null
		beforeEditName : beforeEditName,

		// 用于捕获节点被删除之前的事件回调函数，并且根据返回值确定是否允许删除操作
		// 默认值：null
		beforeRemove : beforeRemove,

		// 用于捕获节点编辑名称结束（Input 失去焦点 或 按下 Enter
		// 键）之后，更新分类名称数据之前的事件回调函数，并且根据返回值确定是否允许更改名称的操作
		// 节点进入编辑名称状态后，按 ESC 键可以放弃当前修改，恢复原名称，取消编辑名称状态
		// 从 v3.5.13 开始，取消编辑状态也会触发此回调，根据 isCancel 参数判断
		// 默认值：null
		beforeRename : beforeRename,

		// 用于捕获删除节点之后的事件回调函数。
		// 如果用户设置了 beforeRemove 回调函数，并返回 false，将无法触发 onRemove 事件回调函数。
		// 默认值：null
		onRemove : onRemove,

		// 用于捕获节点编辑名称结束之后的事件回调函数。
		// 1、节点进入编辑名称状态，并且修改分类名称后触发此回调函数。如果用户设置了 beforeRename 回调函数，并返回
		// false，将无法触发 onRename 事件回调函数。
		// 2、如果通过直接修改 treeNode 的数据，并且利用 updateNode 方法更新，是不会触发此回调函数的。
		// 3、从 v3.5.13 开始，取消编辑状态也会触发此回调，根据 isCancel 参数判断
		// 默认值：null
		onRename : onRename,
		
		//用于捕获 勾选 或 取消勾选 之前的事件回调函数，并且根据返回值确定是否允许 勾选 或 取消勾选 
		beforeCheck : beforeCheck,
		
		//用于捕获 checkbox / radio 被勾选 或 取消勾选的事件回调函数
		//如果设置了 setting.callback.beforeCheck 方法，且返回 false，将无法触发 onCheck 事件回调函数。
		onCheck : onCheck,
	},
	//选择设置
	check: {
		enable: true,	//设置 zTree 的节点上是否显示 checkbox / radio
		autoCheckTrigger: true,	//是否触发回调函数
	}
};

// 节点数据
//var zNodes =[
// 			{ id:1, pId:0, name:"父节点 1", open:true},
// 			{ id:11, pId:1, name:"叶子节点 1-1"},
// 			{ id:12, pId:1, name:"叶子节点 1-2"},
// 			{ id:13, pId:1, name:"叶子节点 1-3"},
// 			{ id:2, pId:0, name:"父节点 2", open:true},
// 			{ id:21, pId:2, name:"叶子节点 2-1"},
// 			{ id:22, pId:2, name:"叶子节点 2-2"},
// 			{ id:23, pId:2, name:"叶子节点 2-3"},
// 			{ id:3, pId:0, name:"父节点 3", open:true},
// 			{ id:31, pId:3, name:"叶子节点 3-1"},
// 			{ id:32, pId:3, name:"叶子节点 3-2"},
// 			{ id:33, pId:3, name:"叶子节点 3-3"}
// 		];

// 拖拽
function beforeDrag(treeId, treeNodes) {
	return false;
}

//编辑之前
function beforeEditName(treeId, treeNode) {
	className = (className === "dark" ? "" : "dark");
	var zTree = $.fn.zTree.getZTreeObj("tree");
	zTree.selectNode(treeNode);
	//return confirm("进入分类 -- " + treeNode.name + " 的编辑状态吗？");
	return true;
}

//删除之前
function beforeRemove(treeId, treeNode) {
	var zTree = $.fn.zTree.getZTreeObj("tree");
	//console.log(treeNode);
	var st = false;
	if(confirm("确认删除 分类 -- " + treeNode.name + " 吗？如果该分类下有子分类会一并删除，请谨慎选择")) {
		$.ajax({
		     type: 'POST',
		     url: baserurl + "/admin/permission/delptype",
		     data: {"id" :treeNode.id }  ,
		     success: function(data , s , x){
		    	if(data) {
		    		st = true;
				} else {
					alert('删除失败');
					st = false;
				}
		     } ,
		     dataType: 'json',
		     async : false,	//同步，会锁住浏览器
		});
		if(st) {
			return true;
		} else {
			return false;
		}
	} else {
		return false;
	}

}

//删除节点
function onRemove(e, treeId, treeNode) {
//	console.log(e);
//	console.log(treeId);
//	console.log(treeNode);
}


//用于捕获节点编辑名称结束（Input 失去焦点 或 按下 Enter 键）之后，更新节点名称数据之前的事件回调函数，并且根据返回值确定是否允许更改名称的操作
function beforeRename(treeId, treeNode, newName, isCancel) {
	className = (className === "dark" ? "" : "dark");
	if (newName.length == 0) {
		alert("名称不能为空.");
		var id = treeNode.tId;
		$("#" + id + "_input").val(treeNode.name);
		var zTree = $.fn.zTree.getZTreeObj("tree");
		setTimeout(function() {
			zTree.editName(treeNode)
		}, 10);
		return false;
	} else {	//ajax 修改名称
		var url = baserurl + "/admin/permission/updateptype";
		//名称根据-拆分数组 0 = 权限名称 1 = 权限代码或者url
		var nameArray = newName.split('-');
		
		$.post(url , {"id" : treeNode.id , "name" : nameArray[0] , "codeorurl" : nameArray.length == 2 ? nameArray[1] : ""} , function(data , s , x){
			if(!data) {
				alert('修改失败');
				var id = treeNode.tId;
				$("#" + id + "_input").val(treeNode.name);
				return false;
			} else {
				return true;
			}
		});
	}
}

//编辑名称之后回调
function onRename(e, treeId, treeNode, isCancel) {
	
}

//显示删除按钮
function showRemoveBtn(treeId, treeNode) {
	//return !treeNode.isFirstNode;
	return ptypedelete;
}

//显示编辑按钮
function showRenameBtn(treeId, treeNode) {
	//return !treeNode.isLastNode;
	return ptypeupdate;
}


// 鼠标移入显示操作控件
var newCount = 1;
function addHoverDom(treeId, treeNode) {
	
	var sObj = $("#" + treeNode.tId + "_span");
	if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0) {
		return;
	}
	
	//判断是否有新增权限
	if(ptypecreate) {	
		//构造添加的节点
		var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
				+ "' title='add node' onfocus='this.blur();'></span>";
		sObj.after(addStr);

		var btn = $("#addBtn_" + treeNode.tId);
		if (btn) {
			btn.bind("click", function() {	//添加节点
				//console.log(treeNode);
				var url = baserurl + "/admin/permission/addptype"
				$.post(url , {"name" : "新分类" + newCount , "pid" : parseInt(treeNode.id) , "path" : treeNode.path + treeNode.id + '-'} , function(data , s , x){
					if(data['status']) {
						var zTree = $.fn.zTree.getZTreeObj("tree");
						//添加的数据
						var addtype = {
								"id"   : (data['id']),	//id
								"pId"  : parseInt(treeNode.id),
								"name" : "新分类" + (newCount++),
								"path" : treeNode.path + treeNode.id + "-",
							};
						zTree.addNodes(treeNode, addtype);
					} else {
						alert("添加失败");
						//myMessage("添加失败", "alert alert-danger");
					}
				});
				
				return false;
			});
		}
	}
	
};

// 鼠标移出隐藏操作控件
function removeHoverDom(treeId, treeNode) {
	$("#addBtn_" + treeNode.tId).unbind().remove();
};

//用于捕获 勾选 或 取消勾选 之前的事件回调函数，并且根据返回值确定是否允许 勾选 或 取消勾选
//在onCheck 之前执行
function beforeCheck(treeId, treeNode) {

}

//用于捕获 checkbox / radio 被勾选 或 取消勾选的事件回调函数
//如果设置了 setting.callback.beforeCheck 方法，且返回 false，将无法触发 onCheck 事件回调函数。
function onCheck(event, treeId, treeNode) {

}